//
//  HMEMoticonManager.swift
//  表情键盘
//
//  Created by Apple on 16/7/28.
//  Copyright © 2016年 Apple. All rights reserved.
//

import UIKit

/// 负责加载数据
class HMEMoticonManager: NSObject {
    static let sharedManager: HMEMoticonManager = HMEMoticonManager()
    
    /// 获取Emoticons.bundle的路径
    let bundlePath = NSBundle.mainBundle().pathForResource("Emoticons", ofType: "bundle")!
    
    /// 最近表情模型归档的路径
    private let recentEmoticonPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! + "/recentEmoticons.plist"
    
    /// 所有表情包只需要加载一次即可
    lazy var emoticonPackages: [HMEmoticonPackageModel] = self.loadEmoticonPackages()
    
    /// 加载所有表情包
    private func loadEmoticonPackages() -> [HMEmoticonPackageModel] {
        let recentEmoticons = loadRecentEmoticons()
        // 最近表情包
        let recentEmoitconPackage = HMEmoticonPackageModel(id: "", group_name_cn: "最近", emoticons: recentEmoticons)
        
        // 默认
        let defaultEmoticonPackage = loadEmoticonPackage("com.sina.default")
        
        // emoji
        let emojiEmoticonPackage = loadEmoticonPackage("com.apple.emoji")
        
        // 浪小花
        let lxhEmoticonPackage = loadEmoticonPackage("com.sina.lxh")
        return [recentEmoitconPackage, defaultEmoticonPackage, emojiEmoticonPackage, lxhEmoticonPackage]
    }
    
    /// 加载一个表情包
    /// id: 表情包文件夹名称
    private func loadEmoticonPackage(id: String) -> HMEmoticonPackageModel {
        
        // info.plist = bundle + /id + /info.plist
        let infoPath = bundlePath + "/" + id + "/info.plist"
//        print("infoPath: \(infoPath)")
        
        let dict = NSDictionary(contentsOfFile: infoPath)!
//        print("dict: \(dict)")
        
        let group_name_cn = dict["group_name_cn"] as! String
        
        // 获取emoitcons这个数组
        let emoticonsArray = dict["emoticons"] as! [[String: String]]
        
        // 保存转好的表情模型
        var emoitconModels = [HMEmoticonModel]()
        for dict in emoticonsArray {
            // 将字典转成表情模型
            let emoticonModel = HMEmoticonModel(id: id, dict: dict)
            
            emoitconModels.append(emoticonModel)
        }
        
        // 创建表情包模型
        return HMEmoticonPackageModel(id: id, group_name_cn: group_name_cn, emoticons: emoitconModels)
    }
    
    /// 添加一个表情到最近表情包里面
    func addFavorite(emoticonModel: HMEmoticonModel) {
        // 找到最近表情包,找到对应的那一页表情数据
        var recentEmoticons = emoticonPackages[0].allPageEmoticons[0]   // Swift操作的数据改变了,原来那个数组并没有改变
        
        // 记录重复表情
        var repeatEmoticon: HMEmoticonModel?
        
        // 判断最近里面是否已经存在一样的表情
        for emoticon in recentEmoticons {
            if emoticon.emoji != nil && emoticon.emoji == emoticonModel.emoji {
                // emoji 重复
                repeatEmoticon = emoticon
                break
            }
            
            if emoticon.png != nil && emoticon.png == emoticonModel.png {
                // 图片表情重复
                repeatEmoticon = emoticon
                break
            }
        }
        
        // 如果有重复的表情就删除重复的表情
        if let rEmoticon = repeatEmoticon {
            // 根据模型查看在数组中的位置
            let index = recentEmoticons.indexOf(rEmoticon)!
            // 有重复的表情,去数组中删除重复的表情
            recentEmoticons.removeAtIndex(index)
        }
        
        // 添加表情模型到最近这页最前面
        recentEmoticons.insert(emoticonModel, atIndex: 0)
        
        // 判断是否超出了一页
        if recentEmoticons.count > 20 {
            // 删除最后一个
            recentEmoticons.removeLast()
        }
        
        // 记得重新赋值回去
        emoticonPackages[0].allPageEmoticons[0] = recentEmoticons
        // 保存最近这页数据
        saveRecentEmoticons()
        
//        print("recentEmoticons: \(recentEmoticons.count)")
//        print("emoticonPackages[0].allPageEmoticons[0]: \(emoticonPackages[0].allPageEmoticons[0])")
    }
    
    /**
     保存最近这页表情数据
     */
    private func saveRecentEmoticons() {
//        print("recentEmoticonPath: \(recentEmoticonPath)")
        
        // 使用归档来保存
        NSKeyedArchiver.archiveRootObject(emoticonPackages[0].allPageEmoticons[0], toFile: recentEmoticonPath)
    }
    
    /// 加载最近表情
    private func loadRecentEmoticons() -> [HMEmoticonModel] {
        if let recentEmoticons = NSKeyedUnarchiver.unarchiveObjectWithFile(recentEmoticonPath) as? [HMEmoticonModel] {
            // 加载到了最近表情模型
            return recentEmoticons
        } else {
            // 没有加载到
            let emptyEmoticons = [HMEmoticonModel]()
            return emptyEmoticons
        }
    }
}
